home *** CD-ROM | disk | FTP | other *** search
/ io Programmo 60 / IOPROG_60.ISO / soft / c++ / gsl-1.1.1-setup.exe / {app} / src / ieee-utils / fp-sunos4.c < prev    next >
Encoding:
C/C++ Source or Header  |  2000-05-05  |  3.3 KB  |  123 lines

  1. /* ieee-utils/fp-sunos4.c
  2.  * 
  3.  * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
  4.  * 
  5.  * This program is free software; you can redistribute it and/or modify
  6.  * it under the terms of the GNU General Public License as published by
  7.  * the Free Software Foundation; either version 2 of the License, or (at
  8.  * your option) any later version.
  9.  * 
  10.  * This program is distributed in the hope that it will be useful, but
  11.  * WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  13.  * General Public License for more details.
  14.  * 
  15.  * You should have received a copy of the GNU General Public License
  16.  * along with this program; if not, write to the Free Software
  17.  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18.  */
  19.  
  20. #include <sys/ieeefp.h>
  21. #include <floatingpoint.h>
  22. #include <signal.h>
  23. #include <gsl/gsl_ieee_utils.h>
  24. #include <gsl/gsl_errno.h>
  25.  
  26. int
  27. gsl_ieee_set_mode (int precision, int rounding, int exception_mask)
  28. {
  29.   char * out ;
  30.  
  31.   switch (precision)
  32.     {
  33.     case GSL_IEEE_SINGLE_PRECISION:
  34.       ieee_flags ("set", "precision", "single", out) ;
  35.       break ;
  36.     case GSL_IEEE_DOUBLE_PRECISION:
  37.       ieee_flags ("set", "precision", "double", out) ;
  38.       break ;
  39.     case GSL_IEEE_EXTENDED_PRECISION:
  40.       ieee_flags ("set", "precision", "extended", out) ;
  41.       break ;
  42.     default:
  43.       ieee_flags ("set", "precision", "extended", out) ;
  44.     }
  45.  
  46.   switch (rounding)
  47.     {
  48.     case GSL_IEEE_ROUND_TO_NEAREST:
  49.       ieee_flags ("set", "direction", "nearest", out) ;
  50.       break ;
  51.     case GSL_IEEE_ROUND_DOWN:
  52.       ieee_flags ("set", "direction", "negative", out) ;
  53.       break ;
  54.     case GSL_IEEE_ROUND_UP:
  55.       ieee_flags ("set", "direction", "positive", out) ;
  56.       break ;
  57.     case GSL_IEEE_ROUND_TO_ZERO:
  58.       ieee_flags ("set", "direction", "tozero", out) ;
  59.       break ;
  60.     default:
  61.       ieee_flags ("set", "direction", "nearest", out) ;
  62.     }
  63.  
  64.   if (exception_mask & GSL_IEEE_MASK_INVALID)
  65.     {
  66.       ieee_handler ("set", "invalid", SIGFPE_IGNORE) ;
  67.     }
  68.   else 
  69.     {
  70.       ieee_handler ("set", "invalid", SIGFPE_ABORT) ;
  71.     }
  72.  
  73.   if (exception_mask & GSL_IEEE_MASK_DENORMALIZED)
  74.     {
  75.       ieee_handler ("set", "denormalized", SIGFPE_IGNORE) ;
  76.     }
  77.   else
  78.     {
  79.       GSL_ERROR ("sunos4 does not support the denormalized operand exception. "
  80.          "Use 'mask-denormalized' to work around this.",
  81.          GSL_EUNSUP) ;
  82.     }
  83.  
  84.  
  85.   if (exception_mask & GSL_IEEE_MASK_DIVISION_BY_ZERO)
  86.     {
  87.       ieee_handler ("set", "division", SIGFPE_IGNORE) ;
  88.     } 
  89.   else
  90.     {
  91.       ieee_handler ("set", "division", SIGFPE_ABORT) ;
  92.     }
  93.   
  94.   if (exception_mask & GSL_IEEE_MASK_OVERFLOW)
  95.     {
  96.       ieee_handler ("set", "overflow", SIGFPE_IGNORE) ;
  97.     }
  98.   else 
  99.     {
  100.       ieee_handler ("set", "overflow", SIGFPE_ABORT) ;
  101.     }
  102.  
  103.   if (exception_mask & GSL_IEEE_MASK_UNDERFLOW)
  104.     {
  105.       ieee_handler ("set", "underflow", SIGFPE_IGNORE) ;
  106.     }
  107.   else
  108.     {
  109.       ieee_handler ("set", "underflow", SIGFPE_ABORT) ;
  110.     }
  111.  
  112.   if (exception_mask & GSL_IEEE_TRAP_INEXACT)
  113.     {
  114.       ieee_handler ("set", "inexact", SIGFPE_ABORT) ;
  115.     }
  116.   else
  117.     {
  118.       ieee_handler ("set", "inexact", SIGFPE_IGNORE) ;
  119.     }
  120.  
  121.   return GSL_SUCCESS ;
  122. }
  123.